/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package com.nys.conci.cliente.bean;

import com.nys.conci.base.BeanBase;
import com.nys.conci.base.excepcion.ExcepcionManager;
import com.nys.conci.base.utilitario.EtiquetasUtil;
import com.nys.conci.base.utilitario.MensajeUtil;
import com.nys.conci.cliente.entidad.Duracion;
import com.nys.conci.cliente.entidad.PlanCliente;
import com.nys.conci.cliente.entidad.PlanPago;
import com.nys.conci.cliente.modelo.ModeloDuracion;
import com.nys.conci.usuario.entidad.Especialidad;
import com.nys.conci.usuario.servicio.ServicioAdministracion;
import java.math.BigDecimal;
import java.util.ArrayList;
import java.util.List;
import javax.annotation.PostConstruct;
import javax.faces.bean.ManagedBean;
import javax.faces.bean.ViewScoped;
import javax.inject.Inject;

/**
 *
 * @author Yeudy10
 * @since 04/02/2013
 */
@ManagedBean
@ViewScoped
public class BeanPlanesPago extends BeanBase {

    //<<<<<<<<<<<<<<<<<<<<<<<<<<<<*******************<<<<<<<<<<<<<<<<<<<<<<<<<<<<
//<<<<<<<<<<<<<<<<<<<<<<<<<<<<     VARIABLES     >>>>>>>>>>>>>>>>>>>>>>>>>>>>
//<<<<<<<<<<<<<<<<<<<<<<<<<<<<*******************<<<<<<<<<<<<<<<<<<<<<<<<<<<<
    @Inject
    private ServicioAdministracion sa;
    private List<PlanPago> lista_planes;
    private List<Especialidad> lista_especialidades;
    private List<Duracion> lista_duracion;
    private PlanPago planTabla;
    private PlanPago planSelect;
    private String nombre;
    private String descripcion;
    private Integer especialidad;
    private BigDecimal pagoInicial;
    private BigDecimal pagoMensual;
    private BigDecimal pagoTotal;
    private BigDecimal duracion;
    private boolean modificar;
    private String numero;

//<<<<<<<<<<<<<<<<<<<<<<<<<<<<*******************<<<<<<<<<<<<<<<<<<<<<<<<<<<<
//<<<<<<<<<<<<<<<<<<<<<<<<<<<<  INICIALIZARORES  >>>>>>>>>>>>>>>>>>>>>>>>>>>>
//<<<<<<<<<<<<<<<<<<<<<<<<<<<<*******************<<<<<<<<<<<<<<<<<<<<<<<<<<<<
    /**
     * Constructor
     */
    public BeanPlanesPago() {
        this.inicializar();
    }

    /**
     * Inicializa las variables del bean, al acceder al constructor
     */
    private void inicializar() {
        try {
            pagoInicial = BigDecimal.ZERO;
            pagoMensual = BigDecimal.ZERO;
            pagoTotal = BigDecimal.ZERO;
        } catch (Exception ex) {
            ExcepcionManager.manejarExcepcion(ex);
        }
    }

    /**
     * Inicializas las variables y atributos del bean, despues del llamado del
     * constructor. Es utilizado para las inicializaciones que utilicen datos de
     * objetos injectados.
     */
    @Override
    @PostConstruct
    public void inicializarPost() {
        lista_planes = new ArrayList<PlanPago>();
        limpiar();
        cargarPlanesPago();
        cargarEspecialidades();
        cargarDuracion();
        setNumero("1");
    }
//<<<<<<<<<<<<<<<<<<<<<<<<<<<<*******************<<<<<<<<<<<<<<<<<<<<<<<<<<<<
//<<<<<<<<<<<<<<<<<<<<<<<<<<<<      MÉTODOS      >>>>>>>>>>>>>>>>>>>>>>>>>>>>
//<<<<<<<<<<<<<<<<<<<<<<<<<<<<*******************<<<<<<<<<<<<<<<<<<<<<<<<<<<<

    public void cargarPlanesPago() {
        try {
            lista_planes = new ArrayList<PlanPago>();
            lista_planes = sa.consultarListaPlanesPago();
        } catch (Exception ex) {
            ExcepcionManager.manejarExcepcion(ex);
        }
    }

    public void cargarDuracion() {
        lista_duracion = new ArrayList<Duracion>();
        lista_duracion = sa.consultarListaDuracion();
    }

    public void cargarEspecialidades() {
        lista_especialidades = new ArrayList<Especialidad>();
        try {
            List<Especialidad> lista = new ArrayList<Especialidad>();
            lista = sa.consultarListaEspecialidades();
            lista_especialidades.addAll(lista);
        } catch (Exception ex) {
            ExcepcionManager.manejarExcepcion(ex);
        }
    }

    public void limpiar() {
        try {
            descripcion = "";
            nombre = "";
            especialidad = null;
            duracion = null;
            pagoInicial = null;
            pagoMensual = null;
            pagoTotal = null;
            modificar = false;
            planSelect = new PlanPago();
            planTabla = new PlanPago();
            setNumero("0");
        } catch (Exception ex) {
            ExcepcionManager.manejarExcepcion(ex);
        }
    }
    /**
     * Método encargado de eliminar un plan de pago, si es valido
     */
    public void eliminarPlanPago() {
        try {
            if (planSelect == null) {
                String mensaje = "Para eliminar seleccione un plan";
                MensajeUtil.agregarMensajeError(mensaje);
            } else {
                if (validarUsado()) {
                    sa.eliminar(planSelect);
                    cargarPlanesPago();
                    numero = "1";
                    String mensaje = "Se eliminó el plan de pago seleccionado";
                    MensajeUtil.agregarMensajeInfo(mensaje);
                }
            }
        } catch (Exception ex) {
            ExcepcionManager.manejarExcepcion(ex);
        }
    }
    /**
     * Método que valida si un plan de pago esta asociado a un plan cliente
     * @return 
     */
    private boolean validarUsado() {
        PlanCliente pc = sa.consultarPlanClientePago(planSelect.getId_plan_pago());

        if (pc != null) {
            String mensaje = "No se puede eliminar, el plan de pago está asociado a un cliente";
            MensajeUtil.agregarMensajeError(mensaje);
            return false;
        } else {
            return true;
        }
    }

    public void guardarPlanPago() {
        try {
            if (validarPlanPago()) {
                PlanPago plan = new PlanPago();
                if (modificar) {
                    planSelect.setDescripcion(getDescripcion());
                    planSelect.setDuracion(duracion);
                    planSelect.setId_especialidad(especialidad);
                    planSelect.setNombre(nombre);
                    planSelect.setPago_incial(pagoInicial);
                    planSelect.setPago_mensual(pagoMensual);
                    planSelect.setPago_total(pagoTotal);
                    sa.guardarPlanpago(planSelect, modificar);
                } else {
                    plan = asignarDatos();
                    plan = sa.guardarPlanpago(plan, modificar);
                    lista_planes.add(plan);
                }
                cargarPlanesPago();
                limpiar();
                numero = "1";
            }
        } catch (Exception ex) {
            ExcepcionManager.manejarExcepcion(ex);
        }
    }

    public void seleccionarPlanPago() {
        try {
            planSelect = planTabla;
            modificar = true;
            setNumero("0");
            cargarDatos();
        } catch (Exception ex) {
            ExcepcionManager.manejarExcepcion(ex);
        }
    }

    public boolean validarPlanPago() {
        boolean resultado = true;
        try {
            if (nombre == null || nombre.isEmpty()) {
                String mensaje = EtiquetasUtil.obtenerEtiqueta("campo.requerido.parametro", "Nombre");
                MensajeUtil.agregarMensajeErrorComponente("form_conci:id_nombre", mensaje);
                resultado = false;
            }
            if (descripcion == null || descripcion.isEmpty()) {
                String mensaje = EtiquetasUtil.obtenerEtiqueta("campo.requerido.parametro", "Descripción");
                MensajeUtil.agregarMensajeErrorComponente("form_conci:id_descripcion", mensaje);
                resultado = false;
            }
            if (especialidad == null) {
                String mensaje = EtiquetasUtil.obtenerEtiqueta("campo.requerido.parametro", "Especialidad");
                MensajeUtil.agregarMensajeErrorComponente("form_conci:id_especialidad", mensaje);
                resultado = false;
            }
            if (duracion == null) {
                String mensaje = EtiquetasUtil.obtenerEtiqueta("campo.requerido.parametro", "Pago Inicial");
                MensajeUtil.agregarMensajeErrorComponente("form_conci:id_pago_inicial", mensaje);
                resultado = false;
            }

            if (pagoInicial == null) {
                String mensaje = EtiquetasUtil.obtenerEtiqueta("campo.requerido.parametro", "pago Mensual");
                MensajeUtil.agregarMensajeErrorComponente("form_conci:id_pago_mensual", mensaje);
                resultado = false;
            }

            if (pagoMensual == null) {
                String mensaje = EtiquetasUtil.obtenerEtiqueta("campo.requerido.parametro", "Pago Total");
                MensajeUtil.agregarMensajeErrorComponente("form_conci:id_pago_total", mensaje);
                resultado = false;
            }

            if (pagoTotal == null) {
                String mensaje = EtiquetasUtil.obtenerEtiqueta("campo.requerido.parametro", "Duración");
                MensajeUtil.agregarMensajeErrorComponente("form_conci:id_duracion", mensaje);
                resultado = false;
            }

            if (lista_planes != null && nombre != null && !nombre.isEmpty()) {
                boolean va = false;
                for (PlanPago plan : lista_planes) {
                    if (modificar && !plan.getId_plan_pago().equals(planSelect.getId_plan_pago()) && plan.getNombre().equals(nombre)) {
                        va = true;
                    } else if (!modificar && plan.getNombre().equals(nombre)) {
                        va = true;
                    }
                }
                if (va) {
                    String mensaje = "No se permite ingresar planes de pago con nombres iguales";
                    MensajeUtil.agregarMensajeError(mensaje);
                    resultado = false;
                }
            }

        } catch (Exception ex) {
            ExcepcionManager.manejarExcepcion(ex);
        }
        return resultado;
    }

    public PlanPago asignarDatos() {
        PlanPago plan = new PlanPago();
        try {
            plan.setDescripcion(getDescripcion());
            plan.setDuracion(duracion);
            plan.setId_especialidad(especialidad);
            plan.setNombre(nombre);
            plan.setPago_incial(pagoInicial);
            plan.setPago_mensual(pagoMensual);
            plan.setPago_total(pagoTotal);

        } catch (Exception ex) {
            ExcepcionManager.manejarExcepcion(ex);
        }

        return plan;
    }

    public void cargarDatos() {

        try {
            nombre = planSelect.getNombre();
            descripcion = planSelect.getDescripcion();
            especialidad = planSelect.getId_especialidad();
            pagoInicial = planSelect.getPago_inicial();
            pagoMensual = planSelect.getPago_mensual();
            pagoTotal = planSelect.getPago_total();
            duracion = planSelect.getDuracion();

        } catch (Exception ex) {
            ExcepcionManager.manejarExcepcion(ex);
        }

    }

    //<<<<<<<<<<<<<<<<<<<<<<<<<<<<*******************<<<<<<<<<<<<<<<<<<<<<<<<<<<<
    //<<<<<<<<<<<<<<<<<<<<<<<<<<<<      GET & SET      >>>>>>>>>>>>>>>>>>>>>>>>>>>>
    //<<<<<<<<<<<<<<<<<<<<<<<<<<<<*******************<<<<<<<<<<<<<<<<<<<<<<<<<<<<
    /**
     * @return the lista_planes
     */
    public List<PlanPago> getLista_planes() {
        return lista_planes;
    }

    /**
     * @param lista_planes the lista_planes to set
     */
    public void setLista_planes(List<PlanPago> lista_planes) {
        this.lista_planes = lista_planes;
    }

    /**
     * @return the planTabla
     */
    public PlanPago getPlanTabla() {
        return planTabla;
    }

    /**
     * @param planTabla the planTabla to set
     */
    public void setPlanTabla(PlanPago planTabla) {
        this.planTabla = planTabla;
    }

    /**
     * @return the planSelect
     */
    public PlanPago getPlanSelect() {
        return planSelect;
    }

    /**
     * @param planSelect the planSelect to set
     */
    public void setPlanSelect(PlanPago planSelect) {
        this.planSelect = planSelect;
    }

    /**
     * @return the nombre
     */
    public String getNombre() {
        return nombre;
    }

    /**
     * @param nombre the nombre to set
     */
    public void setNombre(String nombre) {
        this.nombre = nombre;
    }

    /**
     * @return the descripcion
     */
    public String getDescripcion() {
        return descripcion;
    }

    /**
     * @param descripcion the descripcion to set
     */
    public void setDescripcion(String descripcion) {
        this.descripcion = descripcion;
    }

    /**
     * @return the especialidad
     */
    public Integer getEspecialidad() {
        return especialidad;
    }

    /**
     * @param especialidad the especialidad to set
     */
    public void setEspecialidad(Integer especialidad) {
        this.especialidad = especialidad;
    }

    /**
     * @return the pagoInicial
     */
    public BigDecimal getPagoInicial() {
        return pagoInicial;
    }

    /**
     * @param pagoInicial the pagoInicial to set
     */
    public void setPagoInicial(BigDecimal pagoInicial) {
        this.pagoInicial = pagoInicial;
    }

    /**
     * @return the pagoMensual
     */
    public BigDecimal getPagoMensual() {
        return pagoMensual;
    }

    /**
     * @param pagoMensual the pagoMensual to set
     */
    public void setPagoMensual(BigDecimal pagoMensual) {
        this.pagoMensual = pagoMensual;
    }

    /**
     * @return the pagoTotal
     */
    public BigDecimal getPagoTotal() {
        return pagoTotal;
    }

    /**
     * @param pagoTotal the pagoTotal to set
     */
    public void setPagoTotal(BigDecimal pagoTotal) {
        this.pagoTotal = pagoTotal;
    }

    /**
     * @return the duracion
     */
    public BigDecimal getDuracion() {
        return duracion;
    }

    /**
     * @param duracion the duracion to set
     */
    public void setDuracion(BigDecimal duracion) {
        this.duracion = duracion;
    }

    /**
     * @return the modificar
     */
    public boolean isModificar() {
        return modificar;
    }

    /**
     * @param modificar the modificar to set
     */
    public void setModificar(boolean modificar) {
        this.modificar = modificar;
    }

    /**
     * @return the lista_especialidades
     */
    public List<Especialidad> getLista_especialidades() {
        return lista_especialidades;
    }

    /**
     * @param lista_especialidades the lista_especialidades to set
     */
    public void setLista_especialidades(List<Especialidad> lista_especialidades) {
        this.lista_especialidades = lista_especialidades;
    }

    /**
     * @return the numero
     */
    public String getNumero() {
        return numero;
    }

    /**
     * @param numero the numero to set
     */
    public void setNumero(String numero) {
        this.numero = numero;
    }

    /**
     * @return the lista_duracion
     */
    public List<Duracion> getLista_duracion() {
        return lista_duracion;
    }

    /**
     * @param lista_duracion the lista_duracion to set
     */
    public void setLista_duracion(List<Duracion> lista_duracion) {
        this.lista_duracion = lista_duracion;
    }
}
